# 1.选取当前节点的父节点
# 2.选取当前节点的同级节点
# 3.选择属性等于固定值
# 4.选择属性包含固定值
# 5.字符串拼接（选择两个不同的节点，然后将它们的字符创拼接。）
# 6.解析当前节点下所有字符（string与//text的区别）
# 7.多条件匹配（or）
# 8.将当前节点还原为字符串(打印当前节点的html文本。)
from lxml import etree
data = """
  <div class='a'>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
             <ul>
                 <li class="item-3"><a href="link1.html">first item</a></li>
                 <li class="item-4">000<a href="link2.html">second item</a></li>
                 <li class="item-5"><a href="link3.html">third item</a></li>
                 <li class="item-6"><a href="link4.html">fourth item</a></li>
                 <li class="item-7"><a href="link5.html">fifth item</a>
             </ul>
         </div>
"""
html = etree.HTML(data)

# 1.选取当前节点的父节点  parent
# 获取class=item-0的li标签的父节点
h11 = html.xpath('//li[@class="item-0"]/..')
h12 = html.xpath('//li[@class="item-0"]/parent::*')
print(h11)
print(h12)
print('--'*40)

# 2.选取当前节点的同级节点
# 获取class=item-0的li标签的之后的同级节点  following-sibling   preceding-sibling
h2 = html.xpath('//li[@class="item-0"]/following-sibling::*')
print(h2)
print('--'*40)

# 3.选择属性等于固定值
# 获取class=item-0的所有li标签
h3 = html.xpath('//li[@class="item-0"]')
print(h3)
h3 = html.xpath('//@class')  # 获取所有class属性的属性值
print('--'*40)

# 4.选择属性包含固定值
# 获取a标签中href属性是以link开头的所有a标签
h41 = html.xpath('//a[starts-with(@href,"link")]')
print(h41)
# 获取a标签中含有数字以1的所有标签
h42 = html.xpath('//a[contains(@href,"1")]/text()')
print(h42)
print('--'*40)

# 5.字符串拼接（选择两个不同的节点，然后将它们的字符串拼接。）
# 将class="item-3"的li标签的text与class="item-7"的li标签的text()进行拼接
h5 = html.xpath('concat(//li[@class="item-3"]//text(), //li[@class="item-7"]//text())')
print(h5)
print('--'*40)

# 6.解析当前节点下所有字符（string与//text的区别）
# 获取class=item-4的li标签下的所有文本
# 1.text()
h6_text = html.xpath('//li[@class="item-4"]//text()')
print(h6_text)
# 2.string()
h6_string = html.xpath('string(//li[@class="item-4"])')
print(h6_string)
print('--'*40)
"""
string与//text():
    1.都可以获取当前节点下所有的文本
    2.string()返回的是字符串，会将当前标签下的所有文本与子标签下的所有文本拼接起来
      //text()返回的是list, 会将文本分隔成一个个字符串
"""

# 7.多条件匹配（or）
h7 = html.xpath('//a[@href="link1.html" or @href="link2.html"]/text()')
h7 = html.xpath('//a[@href="link1.html"]/text() | //a[@href="link2.html"]/text()')
print(h7)
print('--'*40)

# 8.将当前节点还原为字符串(打印当前节点的html文本。) etree.tostring()
# h8为列表，取第一个元素
h8 = html.xpath('//li[@class="item-0"]')[0]
h8 = etree.tostring(h8)
print(h8)

